package com.fr.lavollepic.gbdroid;

import java.util.ArrayList;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;

public class MyPreferences extends Activity implements OnClickListener {
	
/* --------------------------------------------- VARIABLES GLOBALES ----------------------------------------------- */

	// on d�finit nos boutons
	 private Button toAddActivity = null;
	 private Button editAlertButton = null;
	 private Button cancelAlertButton = null;
	 private Button deleteAlertButton = null;
	 private Button backButton = null;
	 
	 // on d�finit les variables pour g�rer le SharedPreferences
	 private SharedPreferences urlArrayToString  = null;
	 private SharedPreferences nameArrayToString = null;
	 private SharedPreferences.Editor urlArrayToStringEditor = null;
	 private SharedPreferences.Editor nameArrayToStringEditor = null;
	 
	 // on d�finit les variables pour cr�er notre listView
	 private ListView myListView;
	 private ArrayList<String> arrayListTest;
	 private ArrayAdapter<String> arrayAdaptertest;
	 
	 
	 private LayoutInflater factory = null;
	 private AlertDialog.Builder adb = null;
	 private int onLongClickPosition = 0;
	 
	 private EditText urlRadioPref = null;
	 private EditText nameRadioPref = null;
	 private TextView errorMessage = null;
 	 // on importe les pr�f�rences
	 private String initialUrlString = null;
	 private String initialNameString = null;
	 // on convertit en tableau de string
	 private String[] initialUrlStringSplit = null;
	 private String[] initialNameStringSplit = null;
	 
/* --------------------------------------------- ON CREATE  ----------------------------------------------- */
	 
	public void onCreate(Bundle savedInstanceState) {
	    super.onCreate(savedInstanceState);
        setContentView(R.layout.my_preferences);
       
        // on lie la listeView � son Id
        myListView = (ListView)findViewById(R.id.listView1);
        
        // on d�finit un arrayList qui sera le contenu de la listView myListView
        arrayListTest = new ArrayList<String>();
        arrayAdaptertest = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,arrayListTest);
        
        // Liaison de l'array adapter � la listview.
        myListView.setAdapter(arrayAdaptertest);
        
        // on r�cup�re notre bouton pour aller ajouter un �l�ment
        toAddActivity = (Button)findViewById(R.id.to_add_activity);
        toAddActivity.setOnClickListener(this);
        backButton = (Button)findViewById(R.id.back_button);
        backButton.setOnClickListener(this);
        
        // on dit dans quel fichier stocker les variables des sharedPreference (ici : "radio_preference")
        urlArrayToString = getSharedPreferences("radio_preference", 0);
        nameArrayToString = getSharedPreferences("radio_preference", 0);
        urlArrayToStringEditor = urlArrayToString.edit();
        nameArrayToStringEditor = nameArrayToString.edit();
        
        // on load la view
        loadListView();

        //On instancie notre layout en tant que View
        factory = LayoutInflater.from(this);
        //Cr�ation de l'AlertDialog
		final View alertDialogView = factory.inflate(R.layout.edit_preference_alert_dialog, null);
		adb = new AlertDialog.Builder(this);

        myListView.setOnItemLongClickListener(new OnItemLongClickListener() {
        	public boolean onItemLongClick(AdapterView<?> parent, View v, int position, long id) {

                // on d�finit les edit text pour le nom et l'url
                urlRadioPref = (EditText)alertDialogView.findViewById(R.id.url_radio_pref2);
            	nameRadioPref = (EditText)alertDialogView.findViewById(R.id.name_radio_pref2);
            	
            	// on importe les pr�f�rences
            	initialUrlString = urlArrayToString.getString("url_array", "");
        		initialNameString = nameArrayToString.getString("name_array", "");
        		// on convertit en tableau de string
        		initialUrlStringSplit = initialUrlString.split(",");
        		initialNameStringSplit = initialNameString.split(",");
        		// les indices sont invers�s entre les 2 (donc on prend l'inverse ...)
        		onLongClickPosition = initialUrlStringSplit.length - 1 - position;
        		// on met les valeurs dans les editText
            	urlRadioPref.setText(initialUrlStringSplit[onLongClickPosition]);
            	nameRadioPref.setText(initialNameStringSplit[onLongClickPosition]);       
            	
            	// on d�finit nos boutons submit
            	editAlertButton = (Button)alertDialogView.findViewById(R.id.alert_edit);
            	cancelAlertButton = (Button)alertDialogView.findViewById(R.id.alert_cancel);
            	deleteAlertButton = (Button)alertDialogView.findViewById(R.id.alert_delete);
            	
            	// on d�finit l'action effectu� au clic sur modifier
            	editAlertButton.setOnClickListener(new OnClickListener() {
					@Override
					public void onClick(View v) {
						if ((TextUtils.isEmpty(urlRadioPref.getText().toString()) == false) && (TextUtils.isEmpty(nameRadioPref.getText().toString())) == false) {
	                    	// on modifie la valeur correspondante
	                		initialUrlStringSplit[onLongClickPosition] = urlRadioPref.getText().toString().replaceAll(",", " ");
	                		initialNameStringSplit[onLongClickPosition] = nameRadioPref.getText().toString().replaceAll(",", " ");
	                		// on repace en String pour mettre dans les pr�f�rences
	                		String finalUrlString = implode(initialUrlStringSplit,",");
	                		String finalNameString = implode(initialNameStringSplit,",");
	                		// on rentre dans les pr�f�rences  les nouvelles pr�f�rences.
	                		urlArrayToStringEditor.putString("url_array", finalUrlString);
	            			nameArrayToStringEditor.putString("name_array", finalNameString);
	            			urlArrayToStringEditor.commit();
	            			nameArrayToStringEditor.commit();
	            			Intent monIntent = new Intent(getBaseContext(),MyPreferences.class);
	            			startActivity(monIntent);
	            			finish();
                    	}
                    	else {
                    		// si un champ est vide, on affiche le message d'erreur
                    		errorMessage = (TextView)alertDialogView.findViewById(R.id.textView3);
                    		errorMessage.setVisibility(1);
                    		errorMessage.setText(R.string.champ_vide);
                    	}
					}
				});
            	// on d�finit l'action effectu� au clic sur annuler
            	cancelAlertButton.setOnClickListener(new OnClickListener() {
					@Override
					public void onClick(View v) {
                    	//Lorsque l'on cliquera sur annuler on quittera l'alertdialog
            			Intent monIntent = new Intent(getBaseContext(),MyPreferences.class);
            			startActivity(monIntent);
            			finish();
					}
				});
            	// on d�finit l'action effectu� au clic sur supprimer
            	deleteAlertButton.setOnClickListener(new OnClickListener() {
					@Override
					public void onClick(View v) {
						initialUrlStringSplit[onLongClickPosition] = null;
						initialNameStringSplit[onLongClickPosition] = null;
						String finalUrlString = implode(initialUrlStringSplit,",");
						String finalNameString = implode(initialNameStringSplit,",");
                		// on rentre dans les pr�f�rences  les nouvelles pr�f�rences.
                		urlArrayToStringEditor.putString("url_array", finalUrlString);
            			nameArrayToStringEditor.putString("name_array", finalNameString);
            			urlArrayToStringEditor.commit();
            			nameArrayToStringEditor.commit();
                    	//Lorsque l'on cliquera sur annuler on quittera l'alertdialog
            			Intent monIntent = new Intent(getBaseContext(),MyPreferences.class);
            			startActivity(monIntent);
            			finish();
					}
				});
                //On affecte la vue personnalis� que l'on a cr�e � notre AlertDialog
                adb.setView(alertDialogView);
                //On donne un titre � l'AlertDialog
                adb.setTitle("Modifier");
                //On modifie l'ic�ne de l'AlertDialog pour le fun ;)
                adb.setIcon(android.R.drawable.ic_dialog_alert);
                // affiche le tout
                adb.show();

        		return true;
        	}
		});
	}
/* --------------------------------------------- ON CLICK  ----------------------------------------------- */
	public void onClick(View v) {
		if(v == toAddActivity) {
			// on part sur l'acitvity qui permet d'ajouter un �l�ment
			Intent monIntent = new Intent(this,AddPreference.class);
			startActivity(monIntent);
			finish();
		}
		
		if(v == backButton) {
			// on part depile l'activité MyPreferences de l activitystack; retour homeactivity
			onBackPressed();
		}
		
	}
/* --------------------------------------------- METHODES   ----------------------------------------------- */
    /**
     * Permet de charger (ou mettre � jour) la listView � partir des pr�f�rences
     */
    private void loadListView() {
    	int urlLength = 0,lastCharToDisplay = 0,nameLength = 0, maxLineLength = 0;

    	// on r�cup�re les pr�f�rences (en string)
    	String initialUrlString = urlArrayToString.getString("url_array", "");
		String initialNameString = nameArrayToString.getString("name_array", "");

		 // on v�rifie l'orientation pour limiter le nombre de caract�res � afficher
		 // portrait
		 if (getResources().getConfiguration().orientation == 1)
			 maxLineLength = 25;
		 // paysage
		 if (getResources().getConfiguration().orientation == 2)
			 maxLineLength = 43;
		 
		// on affiche la listView ssi il y a des �l�ments � afficher.
		if (initialUrlString != "" | initialNameString != "") {
			
			// on convertit en tableau de string pour impl�menter l'arrayList
			String[] initialUrlStringSplit = initialUrlString.split(",");
			String[] initialNameStringSplit = initialNameString.split(",");
			

			// on vide le tableau
			arrayListTest.clear();

			// on impl�mente le tableau
			for (int i = 0; i < initialUrlStringSplit.length; i++) {
				// on calcule la longueur de l'url � afficher (n'affichera que les premiers caract�res)
				urlLength = initialUrlStringSplit[i].length();
				nameLength = initialNameStringSplit[i].length();
				lastCharToDisplay = maxLineLength - nameLength;
				if (urlLength < lastCharToDisplay)
					lastCharToDisplay = urlLength;
				arrayListTest.add(0,initialNameStringSplit[i].concat(" - ").concat(initialUrlStringSplit[i].substring(0, lastCharToDisplay)));
			}
			
			// on lui demande de prendre en compte les changements
			arrayAdaptertest.notifyDataSetChanged();
			
		}
		else {
			
			// si les preferences sont vides, on vide l'arrayList au cas ou
			arrayListTest.clear();
			arrayAdaptertest.notifyDataSetChanged();
		}
    }
    /**
     * Permet de mettre en string le tableau, chaque case s�par�e par le delim
     * Si une case est � null, elle sera ignor�e (donc supprimer)
     * @param arrayString : le tableau de string � traiter
     * @param delim : le s�parateur
     * @return : la string contenant chaque �l�ment du tableau s�par� par delim
     */
    public static String implode(String[] arrayString, String delim) {
        String out = "";
        for(int i=0; i< arrayString.length; i++) {
        	if (arrayString[i] != null) {
	            if (i != 0) {
	            	out += delim;
	            }
	            out += arrayString[i];
        	}
        }
        return out;
    }

}
